package Action;

import Forms.CorreoForm;
import beans.Nodo;
import beans.Usuario;
import hibernate.NodoBD;
import hibernate.UsuarioBD;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author Antonio
 */
public class ModificarArbolAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 
            throws Exception {

        //Capturamos el parametro que indica el boton seleccionado
        String seleccion = request.getParameter("accionSeleccionada");
        
        //Si es editar, se edita
        if (seleccion.toLowerCase().equals("editar"))
        {
            return mapping.findForward("editar");
        }
        //Se añade la pareja
        else if (seleccion.equals("anadirPareja"))
        {
            return mapping.findForward("anadirPareja");
        }
        //Si es pareja se trata de añadir hijo a la pareja que indique la cadena
        else if (seleccion.contains("Pareja"))
        {
            //Capturamos el id  de la pareja y vamos a la siguiente pagina
            long id = capturaId(seleccion);
            request.setAttribute("idPareja", id);
            return mapping.findForward("anadirHijo");
        }
        
        //Si se pulsa sobre algun miembro de la familia
        else if (seleccion.contains("enlace"))
        {
            //Capturamos su id incluido 
            long id = capturaId(seleccion);
            NodoBD nodobd = new NodoBD(null);
            //Capturamos el nodo completo para el id seleccionado
            Nodo nodoActual = nodobd.devuelveNodo(id);
            //Hacemos de ese nodo el nodo actual
            request.getSession().setAttribute("nodoActual", nodoActual);
            return mapping.findForward("vuelve");
        }
        //si la opción fue añadir padre
        else if(seleccion.equals("anadirPadre"))
        {
            return mapping.findForward("anadirPadre");
        }
        //si la opción fue añadir madre
        else if (seleccion.equals("anadirMadre")){
        
            return mapping.findForward("anadirMadre");
        }
        else if(seleccion.toLowerCase().equals("correo")){
            Nodo nodoActual = (Nodo)request.getSession().getAttribute("nodoActual");
            String idNodo = String.valueOf(nodoActual.getIdNodo());
            CorreoForm cf = (CorreoForm)form;
            String correoElectronico = cf.getCorreoElectronico();
            if (!esCorrecto(correoElectronico))
            {
                request.setAttribute("falloCorreo", true);
                return mapping.findForward("falloCorreo");
            }
            
            else if (existeCorreo(correoElectronico))
            {
                request.setAttribute("existeCorreo", true);
                return mapping.findForward("falloCorreo");
            }
            
            else
            {                
                String E = servlet.getServletContext().getInitParameter("clavePublicaE");
                String D = servlet.getServletContext().getInitParameter("clavePrivadaD");
                String N = servlet.getServletContext().getInitParameter("claveN");
                Correo.Correo.mandarCorreo(correoElectronico, idNodo, E, D, N);
                return mapping.findForward("vuelve");
            }
        }              
        return mapping.findForward("ok");        
    }

    /**
     * Devuelve el id incluido en una cadena. 
     * El id debe estar en posición 7
     * @param seleccion. 
     * Cadena de la que se obtiene el id
     * @return Long con el id incluido en la cadena
     *    
     */
    private long capturaId(String seleccion) {
        
        long id;
        
        String idS = seleccion.substring(6);
        id = Long.valueOf(idS);
        
        return id;
    }

    private boolean esCorrecto(String correoElectronico) {
        
        if (correoElectronico == null)
            return false;
        Pattern expresion = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
        Matcher matcher = expresion.matcher(correoElectronico);
        if (!matcher.matches())
            return false;
        return true;
            
    }

    private boolean existeCorreo(String correoElectronico) {
        Usuario usuario = new Usuario();
        usuario.setCorreo(correoElectronico);
        UsuarioBD usuarioBD = new UsuarioBD(usuario);
        return usuarioBD.existeUsuario();
    }
}
